/**
 * 全局错误处理中间件
 */

const { ApiError } = require('../utils/api-error');

/**
 * 错误处理中间件
 * 统一处理各种错误，并返回适当的响应
 */
function errorHandler(err, req, res, next) {
  console.error('Error:', err);

  // 如果是API错误，返回对应的状态码和消息
  if (err instanceof ApiError) {
    return res.status(err.statusCode).json({
      success: false,
      code: err.code,
      message: err.message,
      data: err.data
    });
  }

  // Mongoose或Sequelize验证错误
  if (err.name === 'ValidationError') {
    const messages = Object.values(err.errors).map(val => val.message);
    return res.status(400).json({
      success: false,
      code: 'VALIDATION_ERROR',
      message: messages.join(', '),
      errors: err.errors
    });
  }

  // JWT验证错误
  if (err.name === 'JsonWebTokenError') {
    return res.status(401).json({
      success: false,
      code: 'INVALID_TOKEN',
      message: '无效的令牌，请重新登录'
    });
  }

  // JWT过期错误
  if (err.name === 'TokenExpiredError') {
    return res.status(401).json({
      success: false,
      code: 'TOKEN_EXPIRED',
      message: '登录已过期，请重新登录'
    });
  }

  // 处理其他未知错误
  return res.status(500).json({
    success: false,
    code: 'INTERNAL_SERVER_ERROR',
    message: process.env.NODE_ENV === 'production' 
      ? '服务器内部错误'
      : err.message || '服务器内部错误'
  });
}

module.exports = errorHandler; 